﻿#include <stdio.h>
#include <omp.h>
#include <assert.h>

void priv_example3()  // 修正函数名拼写错误
{
    int i, a;

    // 外层并行区域（4个线程）
#pragma omp parallel private(a) num_threads(4)
    {
        a = 1;
        printf("[外层] 线程 %d 初始化 a=%d\n",
            omp_get_thread_num(), a);

        // 内层工作共享（非嵌套并行）
#pragma omp for private(a) nowait
        for (i = 0; i < 10; i++) {
            a = 2;  // 此处的a是循环区域的私有副本
            printf("├─ [循环] 线程 %d 执行迭代 %d → a=%d\n",
                omp_get_thread_num(), i, a);
        }

        // 验证外层私有变量未被修改
        printf("[外层] 线程 %d 结束前 a=%d\n",
            omp_get_thread_num(), a);
        assert(a == 1);
    }
}

int main() {
    omp_set_num_threads(4);  // 控制总线程数
    printf("===== 开始测试 =====\n");
    priv_example3();
    printf("===== 测试通过 =====\n");
    return 0;
}